package poker;
import java.util.Arrays;

import models.Karta;
import models.Talia;
/**
 * Klasa modelujaca ogolna postac gracza.
 */
public abstract class Gracz {
    /**
     * Pole przechowujace imie gracza.
     */
    protected String imie;
    /**
     * Pole przechowujace karty gracza.
     */
    protected Karta[] karty;
    /**
     * Pole przechowujace zetony gracza.
     */
    protected int zetony;
    /**
     * Pole przechowujace ilosc zwyciestw gracza.
     */
    protected int zwyciestwa;
    /**
     * Stala przechowujaca maksymalna ilosc kart jednego gracza.
     */
    private static final int ILOSC_KART = 5;
    /**
     * Pole przechowujaca id gracza.
     */
    private final int id;
    /**
     * Konstruktor tworzacy gracza.
     * 
     * @param im imie gracza
     * @param zet poczatkowa ilosc zetonow gracza.
     * @param indeks identyfikator gracza.
     */
    public Gracz(final String im, final int zet, final int indeks) {
        karty = new Karta[ILOSC_KART];
        imie = im;
        zetony = zet;
        zwyciestwa = 0;
        id = indeks;
    }
    /**
     * Metoda zwracajaca imie oraz karty gracza jako String.
     * 
     * @return imie oraz karty gracza
     */
    public final String toString() {
        String tmp = imie;
        for (int i = 0; i < ILOSC_KART; i++) {
            tmp += " " + karty[i];
        }
        return tmp;
    }
    /**
     * Metoda zwracajaca karty gracza.
     * 
     * @return karty gracza
     */
    public final Karta[] pokazKarty() {
        return karty;
    }
    /**
     * Metoda pozwalajaca na posortowanie kart gracza.
     */
    public final void sortuj() {
        Arrays.sort(karty);
    }
    /**
     * Metoda dodajaca otrzymana jako parametr karte do kart gracza.
     * 
     * @param karta otrzymana karta
     */
    public final void wezKarte(final Karta karta) {
        int i = 0;
        while (karty[i] != null) {
            i++;
        }
        try {
            karty[i] = karta;
        } catch (ArrayIndexOutOfBoundsException e) {
            e.getStackTrace();
        }
    }
    /**
     * Metoda zwracajaca ilosc zetonow gracza.
     * 
     * @return ilosc zetonow gracza.
     */
    public final int pobierzIloscZetonow() {
        return zetony;
    }
    /**
     * Metoda pobierajaca wpisowe od gracza.
     * 
     * @param wpisowe wysokosc wpisowego
     * @return wpisowe lub pozostala ilosc 
     * zetonow gdy gracza nie stac na wisowe.
     */
    public final int pobierzWpisowe(final int wpisowe) {
        if (wpisowe > zetony) {
            int tmp = zetony;
            zetony = 0;
            return tmp;
        } else {
            zetony -= wpisowe;
            return wpisowe;
        }
    }
    /**
     * Metoda zwiekszajaca ilosc zwyciestw gracza.
     */
    public final void dodajWygrana() {
        zwyciestwa++;
    }
    /**
     * Metoda pobierajaca id gracza.
     * 
     * @return id gracza
     */
    public final int pobierzId() {
        return id;
    }
    /**
     * Metoda pozwalajaca na wymiane kart.
     * 
     * @param talia talia kart
     * @return odrzucone karty
     */
    public abstract Karta[] wymienKarty(Talia talia);
}
